package tobebetterjavaer;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class market {

    /**
     * 计算水果价格
     */
    public static BigDecimal calculatePrice(Fruit fruit) {
        if (fruit.getDiscount() == null || fruit.getDiscount().isEmpty()) {
            // 不适用优惠，直接计算原价
            return fruit.getPrice().multiply(BigDecimal.valueOf(fruit.getWeight()));
        } else {
            // 计算折扣价
            return fruit.getPrice().multiply(new BigDecimal(fruit.getDiscount()))
                    .multiply(BigDecimal.valueOf(fruit.getWeight()));
        }
    }

    /**
     * 判断是否有满减优惠
     */
    public static boolean hasFullReductionDiscount(FullReductionDiscount fullReductionDiscount) {
        return fullReductionDiscount != null
                && fullReductionDiscount.getThreshold() != null && fullReductionDiscount.getThreshold().compareTo(BigDecimal.ZERO) > 0
                && fullReductionDiscount.getDiscount() != null && fullReductionDiscount.getDiscount().compareTo(BigDecimal.ZERO) > 0;
    }

    /**
     * 计算水果总价
     */
    public static BigDecimal calculateTotalPrice(List<Fruit> fruits,FullReductionDiscount fullReductionDiscount) {
        BigDecimal totalPrice = BigDecimal.ZERO;
        for (Fruit fruit : fruits) {
            totalPrice = totalPrice.add(calculatePrice(fruit));
        }

        // 判断是否有满减优惠
        if (hasFullReductionDiscount(fullReductionDiscount)) {
            totalPrice = totalPrice.subtract(fullReductionDiscount.getDiscount());
        }
        return totalPrice;
    }

    public static void main(String[] args) {


        /*1、有一家超市，出售苹果和草莓。其中苹果 8 元/斤，草莓 13 元/斤。
        现在顾客 A 在超市购买了若干斤苹果和草莓，需要计算一共多少钱？
        请编写函数，对于 A 购买的水果斤数 (水果斤数为大于等于 0 的整数)，计算并返回所购买商品的总价。*/
        FullReductionDiscount fullReductionDiscount = new FullReductionDiscount();
        List<Fruit> fruits = new ArrayList<>();
        fruits.add(new Fruit("苹果", new BigDecimal("8"), 2, ""));
        fruits.add(new Fruit("草莓", new BigDecimal("13"), 3, ""));
        // Customer A: 55.0
        System.out.println("Customer A: " + calculateTotalPrice(fruits, fullReductionDiscount));

        /*2、超市增加了一种水果芒果，其定价为 20 元/斤。
        现在顾客 B 在超市购买了若干斤苹果、 草莓和芒果，需计算一共需要多少钱？
        请编写函数，对于 B 购买的水果斤数 (水果斤数为大于等于 0 的整数)，计算并返回所购买商品的总价。*/
        fruits.add(new Fruit("芒果", new BigDecimal("20"), 3, ""));
        // Customer B: 115.0
        System.out.println("Customer B: " + calculateTotalPrice(fruits, new FullReductionDiscount()));

        /*3、超市做促销活动，草莓限时打 8 折。
        现在顾客 C 在超市购买了若干斤苹果、 草莓和芒果，需计算一共需要多少钱？
        请编写函数，对于 C 购买的水果斤数 (水果斤数为大于等于 0 的整数)，计算并返回所购买商品的总价。*/
        List<Fruit> fruitsDiscounts = new ArrayList<>();
        fruitsDiscounts.add(new Fruit("苹果", new BigDecimal("8"), 2, "0.8"));
        fruitsDiscounts.add(new Fruit("草莓", new BigDecimal("13"), 3, ""));
        fruitsDiscounts.add(new Fruit("芒果", new BigDecimal("20"), 3, ""));
        // Customer C: 111.80
        System.out.println("Customer C: " + calculateTotalPrice(fruitsDiscounts, new FullReductionDiscount()));

        /*4、促销活动效果明显，超市继续加大促销力度，购物满 100 减 10 块。
        现在顾客 D 在超市购买了若干斤苹果、 草莓和芒果，需计算一共需要多少钱？
        请编写函数，对于 D 购买的水果斤数 (水果斤数为大于等于 0 的整数)，计算并返回所购买商品的总价。*/
        FullReductionDiscount discount = new FullReductionDiscount(new BigDecimal("100"), new BigDecimal("10"));
        // Customer D: 101.80
        System.out.println("Customer D: " + calculateTotalPrice(fruitsDiscounts, discount));

    }
}
